前端那些事

vuePress-theme-reco chenpeng    2020 - 2021
前端那些事 前端那些事

Choose mode

  • dark
  • auto
  • light
首页
文章目录
  • Browser
  • CSS
  • ES6
  • JavaScript
  • Network
  • TypeScript
  • Vue
  • Vue3
  • Webpack
标签
时间轴
GitHub
author-avatar

chenpeng

85

Article

25

Tag

首页
文章目录
  • Browser
  • CSS
  • ES6
  • JavaScript
  • Network
  • TypeScript
  • Vue
  • Vue3
  • Webpack
标签
时间轴
GitHub
  • JS-API

    • new的原理
    • new和Object.create的区别
    • bind、call、apply的区别
    • 如何正确判断this的指向
    • 深拷贝与浅拷贝

new和Object.create的区别

vuePress-theme-reco chenpeng    2020 - 2021

new和Object.create的区别

chenpeng 2020-11-30 JS API

Object.create

语法:

Object.create(proto[, propertiesObject])
1

参数:

  • proto:新创建对象的原型对象
  • propertiesObject:对象的属性描述符以及相应的属性名称,描述符具有以下键:
    • configurable
      • 是否可配置,默认为 false
    • enumerable
      • 是否可枚举,默认为 false
    • writable
      • 是否可修改,默认为 false
    • value
      • 该属性对应的值,默认为 undefined
    • get
      • 属性的 getter 函数,当访问该属性时,会调用此函数,该函数的返回值会被用作属性的值,默认为 undefined
    • set
      • 属性的 setter 函数,当属性值被修改时,会调用此函数,默认为 undefined

new 和 Object.create 创建对象的区别:

function Person(name, age) {
    this.name = name;
    this.age = age;
}
const test1 = new Person('张三', 20);
const test2 = Object.create(Person.prototype, {
    name: {
        value: '赵四'
    },
    age: {
        value: 20
    }
});
console.log(test1); // Person {name: "张三", age: 20}
console.log(test2); // Person {name: "赵四", age: 20}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

new 创建对象直接使用构造函数即可,而 Object.create 需要传入构造函数的原型,将新创建对象的原型指向构造函数的原型

如果传入的原型对象为 null

const test2 = Object.create(null, {
    name: {value: '赵四'},
    age: {value: 20}
});
/*
	{name: "赵四", age: 20}
    age: 20
    name: "赵四"
*/
1
2
3
4
5
6
7
8
9

image-20200724204359305

新创建的对象就不会继承 Object 的属性和方法

如果传入的原型对象为 {}

const test2 = Object.create({}, {
    name: {value: '赵四'},
    age: {value: 20}
});
1
2
3
4

image-20200724204324085

新创建的对象在 Object 原型的基础上又多了一层原型嵌套

如果不传入原型对象

const test2 = Object.create({
    name: {value: '赵四'},
    age: {value: 20}
});
1
2
3
4

image-20200724204455325

新创建对象的属性会绑定到对象的原型对象上

使用 Object.create(null) 创建对象,没有任何属性,可以得到一个非常干净且高度定制的对象